Django documentation

12. Relating a model to another model more than once

In this example, a Person can have a mother and father -- both of which are other Person objects.

Set related_name to designate what the reverse relationship is called.

Model source code

from django.core import meta

class Person(meta.Model):
    full_name = meta.CharField(maxlength=20)
    mother = meta.ForeignKey('self', null=True, related_name='mothers_child')
    father = meta.ForeignKey('self', null=True, related_name='fathers_child')

    def __repr__(self):
        return self.full_name

API reference

Person objects have the following methods:

  • add_fathers_child()
  • add_mothers_child()
  • delete()
  • get_father()
  • get_fathers_child()
  • get_fathers_child_count()
  • get_fathers_child_list()
  • get_mother()
  • get_mothers_child()
  • get_mothers_child_count()
  • get_mothers_child_list()
  • save()

Sample API usage

This sample code assumes the above model has been saved in a file examplemodel.py.

>>> from django.models.examplemodel import persons

# Create two Person objects -- the mom and dad in our family.
>>> dad = persons.Person(full_name='John Smith Senior', mother=None, father=None)
>>> dad.save()
>>> mom = persons.Person(full_name='Jane Smith', mother=None, father=None)
>>> mom.save()

# Give mom and dad a kid.
>>> kid = persons.Person(full_name='John Smith Junior', mother=mom, father=dad)
>>> kid.save()

>>> kid.get_mother()
Jane Smith
>>> kid.get_father()
John Smith Senior
>>> dad.get_fathers_child_list()
[John Smith Junior]
>>> mom.get_mothers_child_list()
[John Smith Junior]
>>> kid.get_mothers_child_list()
[]
>>> kid.get_fathers_child_list()
[]

Comments

Post a comment

Note: Please only use the comments for questions/critcisms/suggestions on the docs; if you experience errors please file a ticket, ask in the IRC channel, or post to the django-users list. Comments will be periodically reviewed, integrated into the documentation proper, and removed.

Your name:

Comment: